import simpy
import random

# 1. 随机数种子保证每次产生结果都一样
# 2. 医生看病耗时是指数分布 lambda=3
# 3. 模拟进入就诊队列的时间
# 4. 模拟看医生时间
# 5. 模拟离开医生时间
# 6. 记录进入就诊队列时间、看医生时间、离开医生时间
# 7. 模拟65%的回诊概率
# 8. 模拟回诊后优先插队

# (1)能够同时输入复杂分布的参数 ，包括到达和服务 
# (2)能够随时间动态更新分布参数 
# (3)能够输入队列的规则参数，比如队列数，即使是1个窗口也可以支持多个队列，插队规则 
# (4)能够输出仿真过程的细粒度过程数据CSV这种
# (5)能够输出瞬时指标和统计指标


RANDOM_SEED = 42
random.seed(RANDOM_SEED)

# 挂号患者数量
registry_outpatient_count = 10
# 挂号患者时间间隔期望, 多少个单位时间会有一个患者到达
registry_duration_exceptation = 10

outpatients = []

def registry(env, number, interval):
    """生成患者依次到达并挂号事件"""
    counter = 0
    for _ in range(number):
        t = random.expovariate(1.0/interval)
        counter += 1
        print(f'患者{counter}到达于: {env.now}')
        yield env.timeout(t)

env = simpy.Environment()
env.process(registry(env, registry_outpatient_count, registry_duration_exceptation))
env.run()
# 这里后面可改为导出CSV
for outpatient in outpatients:
    print(outpatient)
